/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.beans;

import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import org.cip.esymons.colegiatura.bc.ColegiadoFacadeLocal;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.general.bc.PersonaNaturalFacadeLocal;
import org.cip.esymons.general.bc.SolicitanteFacadeLocal;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.general.util.Utiles;
import org.cip.esymons.tesoreria.adapters.AdaptadorDeudaMovimientoAnual;
import org.cip.esymons.tesoreria.adapters.AdaptadorDeudaMovimientoCuentaIngreso;
import org.cip.esymons.tesoreria.adapters.CuotasPorAnio;
import org.cip.esymons.tesoreria.adapters.DeudaAnual;
import org.cip.esymons.tesoreria.adapters.DeudaAnualInterfaz;
import org.cip.esymons.tesoreria.adapters.DeudaCuentaIngreso;
import org.cip.esymons.tesoreria.adapters.DeudaCuentaIngresoInterfaz;
import org.cip.esymons.tesoreria.adapters.DeudaMovimiento;
import org.cip.esymons.tesoreria.bc.MovimientoCuentaFacadeLocal;
import org.cip.esymons.tesoreria.be.DetPagoAgrupado;
import org.cip.esymons.tesoreria.be.EnumTipoDeuda;

/**
 *
 * @author Ingrid
 */
public class ControlDeudaController {

    private int tipoBusquedaDNICIP;
    private Solicitante solicitanteSeleccionado;
    private String dnioNroCip;
    @EJB
    PersonaNaturalFacadeLocal personaNaturalFacadeLocal;
    @EJB
    ColegiadoFacadeLocal colegiadoFacadeLocal;
    @EJB
    SolicitanteFacadeLocal solicitanteFacadeLocal;
    @EJB
    MovimientoCuentaFacadeLocal movimientoCuentaFacadeLocal;
    private DeudaMovimiento deudaMovimientoParaCuotas = new DeudaMovimiento();
    private DeudaMovimiento deudaMovimientoParaEventos = new DeudaMovimiento();
    private DeudaMovimiento deudaMovimientoParaMultas = new DeudaMovimiento();
    private DeudaMovimiento deudaMovimientoParaOtros = new DeudaMovimiento();
    private DeudaMovimiento deudaMovimientoParaFraccioanamiento = new DeudaMovimiento();
    private DeudaMovimiento deudaMovimientoParaColegiatura = new DeudaMovimiento();
    private DeudaCuentaIngreso deudaCuentaIngresoParaEventos = new DeudaCuentaIngreso();
    private DeudaCuentaIngreso deudaCuentaIngresoParaMultas = new DeudaCuentaIngreso();
    private DeudaCuentaIngreso deudaCuentaIngresoParaOtros = new DeudaCuentaIngreso();
    private DeudaCuentaIngreso deudaCuentaIngresoParaFraccionamiento = new DeudaCuentaIngreso();
    private DeudaCuentaIngreso deudaCuentaIngresoParaColegiatura = new DeudaCuentaIngreso();
    private DeudaAnual deudaAnual = new DeudaAnual();
    private Long codigoSolicitante = 0L;
    private Double deudaTotal;   

    public ControlDeudaController() {
        tipoBusquedaDNICIP = 1;
    }

    public String limpiarPagina() {
        dnioNroCip = null;
        codigoSolicitante = 0L;
        deudaMovimientoParaCuotas = new DeudaMovimiento();
        deudaMovimientoParaEventos = new DeudaMovimiento();
        deudaMovimientoParaMultas = new DeudaMovimiento();
        deudaMovimientoParaOtros = new DeudaMovimiento();
        deudaMovimientoParaFraccioanamiento = new DeudaMovimiento();
        deudaMovimientoParaColegiatura = new DeudaMovimiento();
        deudaCuentaIngresoParaEventos = new DeudaCuentaIngreso();
        deudaCuentaIngresoParaMultas = new DeudaCuentaIngreso();
        deudaCuentaIngresoParaOtros = new DeudaCuentaIngreso();
        deudaCuentaIngresoParaFraccionamiento = new DeudaCuentaIngreso();
        deudaCuentaIngresoParaColegiatura = new DeudaCuentaIngreso();
        deudaAnual = new DeudaAnual();
        tipoBusquedaDNICIP = 1;
        solicitanteSeleccionado = null;

        return "nuevo";
    }

    public String buscarPersona() {        
        try {
            solicitanteSeleccionado = null;
            if (tipoBusquedaDNICIP == 0) {
                solicitanteSeleccionado = (Solicitante) personaNaturalFacadeLocal.buscarXDni(dnioNroCip);
            } else {
                if (tipoBusquedaDNICIP == 1) {  /*Ingreso de CIP */
                    String cipReal = Utiles.devuelveCipCompleto(dnioNroCip);
                    Colegiado colegiadoSeleccionado = null;
                    colegiadoSeleccionado = colegiadoFacadeLocal.buscarColegiadoXCip(cipReal);
                    if (colegiadoSeleccionado != null) {
                        solicitanteSeleccionado = (Solicitante) colegiadoSeleccionado.getPersonaNatural();
                    } else {
                        solicitanteSeleccionado = null;
                    }
                } else {
                    solicitanteSeleccionado = solicitanteFacadeLocal.buscarPorRuc(dnioNroCip);
                }
            }
            if (solicitanteSeleccionado == null) {
                ControladorAbstracto.warn("No exite la persona buscada.Intente con otro valor");
            }

            return null;
        } catch (Exception ex) {
            ControladorAbstracto.error("Ocurrio un error grave al buscar persona");
            return null;
        }
    }

    public List<CuotasPorAnio> getMostrarDeudaCuotas() {
        try {
            if (!this.codigoSolicitante.equals(solicitanteSeleccionado.getSolCodigo())) {
                deudaMovimientoParaCuotas = new DeudaMovimiento();
                deudaMovimientoParaCuotas.setListaMovimientos(movimientoCuentaFacadeLocal.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.CUOTA_CIP));
                DeudaAnualInterfaz dai = new AdaptadorDeudaMovimientoAnual(deudaMovimientoParaCuotas);
                deudaAnual = new DeudaAnual();
                deudaAnual.setListaCuotasPorAnio(dai.getListaCuotasPorAnio());
                deudaTotal = deudaAnual.deudaTotal();
            }
            return deudaAnual.getListaCuotasPorAnio();
        } catch (Exception e) {
            return new ArrayList<CuotasPorAnio>();
        }
    }

    public List<DetPagoAgrupado> getMostrarDeudaEventos() {
        try {
            if (!this.codigoSolicitante.equals(solicitanteSeleccionado.getSolCodigo())) {
                deudaMovimientoParaEventos = new DeudaMovimiento();
                deudaMovimientoParaEventos.setListaMovimientos(movimientoCuentaFacadeLocal.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.EVENTO));
                DeudaCuentaIngresoInterfaz dci = new AdaptadorDeudaMovimientoCuentaIngreso(deudaMovimientoParaEventos, true);
                deudaCuentaIngresoParaEventos = new DeudaCuentaIngreso();
                deudaCuentaIngresoParaEventos.setListaDeudaxIngreso(dci.getListaDeudaxIngreso());
            }
            return deudaCuentaIngresoParaEventos.getListaDeudaxIngreso();
        } catch (Exception e) {
            return new ArrayList<DetPagoAgrupado>();
        }
    }

    public Double getTotalDeudaEventos(){
        return deudaCuentaIngresoParaEventos.totalDeudaMovimientos();
    }

    public List<DetPagoAgrupado> getMostrarDeudaMulta() {
        try {
            if (!this.codigoSolicitante.equals(solicitanteSeleccionado.getSolCodigo())) {
                deudaMovimientoParaMultas = new DeudaMovimiento();
                deudaMovimientoParaMultas.setListaMovimientos(movimientoCuentaFacadeLocal.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.MULTA));
                DeudaCuentaIngresoInterfaz dci = new AdaptadorDeudaMovimientoCuentaIngreso(deudaMovimientoParaMultas, true);
                deudaCuentaIngresoParaMultas = new DeudaCuentaIngreso();
                deudaCuentaIngresoParaMultas.setListaDeudaxIngreso(dci.getListaDeudaxIngreso());
            }
            return deudaCuentaIngresoParaMultas.getListaDeudaxIngreso();
        } catch (Exception e) {
            return new ArrayList<DetPagoAgrupado>();
        }
    }

    public Double getTotalDeudaMulta(){
        return deudaCuentaIngresoParaMultas.totalDeudaMovimientos();
    }

    public List<DetPagoAgrupado> getMostrarDeudaOtros() {
        try {
            if (!this.codigoSolicitante.equals(solicitanteSeleccionado.getSolCodigo())) {
                deudaMovimientoParaOtros = new DeudaMovimiento();
                deudaMovimientoParaOtros.setListaMovimientos(movimientoCuentaFacadeLocal.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.OTROS));
                DeudaCuentaIngresoInterfaz dci = new AdaptadorDeudaMovimientoCuentaIngreso(deudaMovimientoParaOtros, true);
                deudaCuentaIngresoParaOtros = new DeudaCuentaIngreso();
                deudaCuentaIngresoParaOtros.setListaDeudaxIngreso(dci.getListaDeudaxIngreso());
            }
            return deudaCuentaIngresoParaOtros.getListaDeudaxIngreso();
        } catch (Exception e) {
            return new ArrayList<DetPagoAgrupado>();
        }
    }

    public Double getTotalDeudaOtros(){
        return deudaCuentaIngresoParaOtros.totalDeudaMovimientos();
    }

    public List<DetPagoAgrupado> getMostrarDeudaFraccioanamiento() {
        try {
            if (!this.codigoSolicitante.equals(solicitanteSeleccionado.getSolCodigo())) {
                deudaMovimientoParaFraccioanamiento = new DeudaMovimiento();
                deudaMovimientoParaFraccioanamiento.setListaMovimientos(movimientoCuentaFacadeLocal.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.FRACCIONAMIENTO));
                DeudaCuentaIngresoInterfaz dci = new AdaptadorDeudaMovimientoCuentaIngreso(deudaMovimientoParaFraccioanamiento, true);
                deudaCuentaIngresoParaFraccionamiento = new DeudaCuentaIngreso();
                deudaCuentaIngresoParaFraccionamiento.setListaDeudaxIngreso(dci.getListaDeudaxIngreso());
            }
            return deudaCuentaIngresoParaFraccionamiento.getListaDeudaxIngreso();
        } catch (Exception e) {
            return new ArrayList<DetPagoAgrupado>();
        }
    }

    public Double getTotalDeudaFracionamiento(){
        return deudaCuentaIngresoParaFraccionamiento.totalDeudaMovimientos();
    }

    public List<DetPagoAgrupado> getMostrarDeudaColegiatura() {
        try {
            if (!this.codigoSolicitante.equals(solicitanteSeleccionado.getSolCodigo())) {
                deudaMovimientoParaColegiatura = new DeudaMovimiento();
                deudaMovimientoParaColegiatura.setListaMovimientos(movimientoCuentaFacadeLocal.deudaxTipo(solicitanteSeleccionado, EnumTipoDeuda.COLEGIATURA));
                DeudaCuentaIngresoInterfaz dci = new AdaptadorDeudaMovimientoCuentaIngreso(deudaMovimientoParaColegiatura, true);
                deudaCuentaIngresoParaColegiatura = new DeudaCuentaIngreso();
                deudaCuentaIngresoParaColegiatura.setListaDeudaxIngreso(dci.getListaDeudaxIngreso());
                codigoSolicitante = solicitanteSeleccionado.getSolCodigo();
            }            
            return deudaCuentaIngresoParaColegiatura.getListaDeudaxIngreso();
        } catch (Exception e) {
            return new ArrayList<DetPagoAgrupado>();
        }
    }

    public Double getTotalDeudaColegiatura(){
        return deudaCuentaIngresoParaColegiatura.totalDeudaMovimientos();
    }

    /**
     * @return the tipoBusquedaDNICIP
     */
    public int getTipoBusquedaDNICIP() {
        return tipoBusquedaDNICIP;
    }

    /**
     * @param tipoBusquedaDNICIP the tipoBusquedaDNICIP to set
     */
    public void setTipoBusquedaDNICIP(int tipoBusquedaDNICIP) {
        this.tipoBusquedaDNICIP = tipoBusquedaDNICIP;
    }

    /**
     * @return the dnioNroCip
     */
    public String getDnioNroCip() {
        return dnioNroCip;
    }

    /**
     * @param dnioNroCip the dnioNroCip to set
     */
    public void setDnioNroCip(String dnioNroCip) {
        this.dnioNroCip = dnioNroCip;
    }

    /**
     * @return the solicitanteSeleccionado
     */
    public Solicitante getSolicitanteSeleccionado() {
        return solicitanteSeleccionado;
    }

    /**
     * @param solicitanteSeleccionado the solicitanteSeleccionado to set
     */
    public void setSolicitanteSeleccionado(Solicitante solicitanteSeleccionado) {
        this.solicitanteSeleccionado = solicitanteSeleccionado;
    }

    /**
     * @return the deudaTotal
     */
    public Double getDeudaTotal() {
        return deudaTotal;
    }

    /**
     * @param deudaTotal the deudaTotal to set
     */
    public void setDeudaTotal(Double deudaTotal) {
        this.deudaTotal = deudaTotal;
    }   
}
